home *** CD-ROM | disk | FTP | other *** search
/ Technotools / Technotools (Chestnut CD-ROM)(1993).ISO / lang_c / add_cs / add_cs.c next >
Text File  |  1987-07-31  |  4KB  |  154 lines

  1. /*
  2.  
  3. Rather than providing you with an executable module, I am releasing
  4. the source code.  Since no two programmers want the same features,
  5. you can customize the program so that you 'can have it your way.' 
  6. The only thing that I ask is that it NOT be used for commercial
  7. ventures of ANY kind.  No amount of modification and/or rewrite of
  8. the source code will allow you to consider the resultant source code
  9. to be your property.
  10.  
  11. Enjoy!
  12.  
  13.         Eugene J. Alm
  14.         12145 West Luther Court
  15.         Hales Corners, Wisconsin, 53130
  16.                     
  17. Copyright 1987 by Eugene J. Alm.  All rights reserved.                       */
  18.  
  19.  
  20. #include "stdio.h"     /* fopen, fclose, fgets, fputs,
  21.                           printf, fputchar */
  22.  
  23. #include "dos.h"       /* unlink */
  24. #include "stdlib.h"    /* atoi, exit */
  25. #include "io.h"        /* access */
  26.  
  27. #define BUF_SIZ  256
  28.  
  29. FILE *in_data0, *in_data1, *out_data;
  30. char buffer [BUF_SIZ];
  31. enum exit_type { normal, error_exit };
  32.  
  33. void terminate (int, enum exit_type);
  34.  
  35. main (argc, argv)
  36.  
  37.   int argc;
  38.   char *argv []; {
  39.  
  40.   char *temp0;
  41.   int  s_line, asm_line;
  42.  
  43.   if (argc != 4) {
  44.     printf ("\n  Invoke using:\n\n    add_cs  c_filename\
  45.  asm_filename result_filename\n\n    Where:\n\n");
  46.     printf ("    c_filename is the source file including the .c extension.\n\n");
  47.     printf ("    asm_filename is the assembly language source file generated\n\
  48.     using TCC.  The .asm extension must be supplied.\n\n");
  49.     printf ("    result_filename is where the modified assembly language file\n\
  50.     is stored.  If this file already exists, the run is aborted.");
  51.  
  52.     exit (0);
  53.   }
  54.  
  55.   if ((access (argv [3], 0)) == 0) {
  56.     printf ("\n\nThe file %s already exists.", argv [3]);
  57.     terminate (0, error_exit);
  58.   }
  59.   if ((in_data0 = fopen (argv [1], "r")) != NULL) {
  60.  
  61.     if ((in_data1 = fopen (argv [2], "r")) != NULL) {
  62.  
  63.       if ((out_data = fopen (argv [3], "w")) != NULL) {
  64.  
  65.         temp0 = &buffer [0];
  66.         s_line = 0;
  67.         printf ("\n");
  68.  
  69.         while ((fgets (buffer, BUF_SIZ - 1, in_data1)) != NULL) {
  70.  
  71.           if (*temp0 != ';')
  72.             fputs (temp0, out_data);
  73.           else {
  74.             asm_line = atoi (temp0 + 7);
  75.             printf (".");
  76.             do {
  77.               fputs ("; * ", out_data);
  78.               if ((fgets (buffer, BUF_SIZ - 1, in_data0)) != NULL)
  79.                 fputs (temp0, out_data);
  80.               else {
  81.                 printf ("\nInput from %s terminated prematurely.", argv [1]);
  82.                 terminate (3, normal);
  83.                 unlink (argv [3]);
  84.                 terminate (0, error_exit);
  85.               }
  86.             }  while ((++s_line) < asm_line);
  87.           }
  88.         }
  89.         terminate (3, normal);
  90.       }
  91.       else {
  92.         printf ("\n\nCannot open %s.", argv [3]);
  93.         terminate (2, error_exit);
  94.       }
  95.     }
  96.     else {
  97.       printf ("\n\nCannot open %s.", argv [2]);
  98.       terminate (1, error_exit);
  99.     }
  100.   }
  101.   else {
  102.     printf ("\n\nCannot open %s.", argv [1]);
  103.     terminate (0, error_exit);
  104.   }
  105.   printf ("\n\nProcessing completed.\n");
  106.   exit (0);
  107. }
  108.  
  109. void terminate (count, state)
  110.  
  111.   int count;
  112.   enum exit_type state; {
  113.  
  114.   if (count > 2)
  115.     fclose (out_data);
  116.   if (count > 1)
  117.     fclose (in_data1);
  118.   if (count > 0)
  119.     fclose (in_data0);
  120.  
  121.   if (state == error_exit) {
  122.     printf ("  Processing aborted.\n");
  123.     exit (1);
  124.   }
  125. }
  126.  
  127. /*  The following is an abbreviated version of the printf library
  128.     function.  If you wish to use the "full blown" printf from the
  129.     library, comment out (or delete) printf as shown below.  This was
  130.     done in this manner to make the executable file smaller.    */
  131.  
  132. int printf (str)
  133.  
  134.   char  *str; {
  135.  
  136.   char  *temp0, **stack;
  137.   char  c;
  138.  
  139.   stack = &str;
  140.   while ((c = *str++) != 0) {
  141.     if (c == '%') {
  142.       str++;
  143.       temp0 = *++stack;
  144.  
  145.       while ((c = *temp0++) != 0)
  146.         fputchar (c);
  147.     }
  148.     else
  149.       fputchar (c);
  150.   }
  151. }
  152.  
  153.  
  154.